package kotlinquanweizhinan.chapt05匿名函数与函数类型.内联函数

class SimVillage {
}

fun main(args:Array<String>) {
    runSimulation("Guyal"){ playerName,numBuildings ->
        val currentYear = 2018
        println("Adding $numBuildings houses")
        "Welcome to SimVillage,$playerName!(copyreight $currentYear)"
    }
    /**
     * 这种简略写法只支持lambda参数排在最后的情况，所以，定义函数时，建议把函数类型的参数放在最后，以方便调用者使用。
     */
}

//Kotlin优化机制内联，可以解决lambda引起的内存开销问题。有了内联，JVM就不需要使用lambda对象实例了，因而避免了变量内存分配。
inline fun runSimulation(playerName:String,
                          greetingFunction:(String,Int) ->String){
    val numBuildings = (1..3).shuffled().last() //Randomly selects 1,2,or3
    println(greetingFunction(playerName,numBuildings))
}

/**
 * 通常来说，使用inline关键字标记使用lambda的函数是个好主意。然而，有时却不一定行。
 * 例如，使用lambda的递归函数就无法内联，因为内联递归函数会让复制粘贴函数体行为无限
 * 循环。如果你非要尝试，编译器也会发出警告并阻止你这么做。
 *
 */
/
